﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;

namespace GestionaleLib.Controller
{
    public class ctrlProdotti
    {
        #region "Testata"
        #region "Proprietà"
        private Connector Connessione;
        #endregion
        public enum Insert
        {
            Successo,
            Errore
        }
        public enum Edit
        {
            Successo,
            Errore
        }
        public enum Delete
        {
            Successo,
            Errore
        }
        #endregion

        public ctrlProdotti()
        {
            Connessione = Connector.Istance();
        }

        /// <summary>
        /// Inserisce un nuovo prodotto
        /// </summary>
        /// <param name="Prodotto"></param>
        /// <returns></returns>
        public Insert Nuovo(Prodotto Prodotto)
        {
            string sql = @"
                INSERT INTO Prodotti 
                    VALUES(@Id,@Codice,@BarCode,@Descrizione,@IdAliquota,@Prezzo,@IdTaglia,@IdColore,@IdParametro,@MinimoMagazzino,@IdFornitore)
            ";
            SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@Id", (Guid)Prodotto.Id);
            cmd.Parameters.AddWithValue("@Codice", Prodotto.Codice);
            cmd.Parameters.AddWithValue("@BarCode", Prodotto.BarCode);
            cmd.Parameters.AddWithValue("@Descrizione", Prodotto.Descrizione);
            cmd.Parameters.AddWithValue("@IdAliquota", (Guid)Prodotto.Aliquota.Id);
            cmd.Parameters.AddWithValue("@Prezzo", (double)Prodotto.Prezzo);

            SqlCeParameter idtaglia = new SqlCeParameter();
            idtaglia.DbType = DbType.Guid;
            idtaglia.ParameterName = "@IdTaglia";
            if (Prodotto.Taglia != null)
                idtaglia.Value = (Guid)Prodotto.Taglia.Id;
            else
                idtaglia.Value = DBNull.Value;
            cmd.Parameters.Add(idtaglia);

            SqlCeParameter idcolore = new SqlCeParameter();
            idcolore.DbType = DbType.Guid;
            idcolore.ParameterName = "@IdColore";
            if (Prodotto.Colore != null)
                idcolore.Value = (Guid)Prodotto.Colore.Id;
            else
                idcolore.Value = DBNull.Value;
            cmd.Parameters.Add(idcolore);

            SqlCeParameter idparametro = new SqlCeParameter();
            idparametro.DbType = DbType.Guid;
            idparametro.ParameterName = "@IdParametro";
            if (Prodotto.Parametro != null)
                idparametro.Value = (Guid)Prodotto.Parametro.Id;
            else
                idparametro.Value = DBNull.Value;
            cmd.Parameters.Add(idparametro);

            cmd.Parameters.AddWithValue("@MinimoMagazzino", (int)Prodotto.MinimoMagazzino);

            SqlCeParameter idfornitore = new SqlCeParameter();
            idfornitore.DbType = DbType.Guid;
            idfornitore.ParameterName = "@IdFornitore";
            if (Prodotto.Fornitore != null)
                idfornitore.Value = (Guid)Prodotto.Fornitore.Id;
            else
                idfornitore.Value = DBNull.Value;
            cmd.Parameters.Add(idfornitore);

            try
            {
                cmd.ExecuteNonQuery();
                return Insert.Successo;
            }
            catch
            {
                throw new ExceptionErroreInserimento();
            }
        }
        /// <summary>
        /// Modifica un prodotto esistente tramite Id
        /// </summary>
        /// <param name="Prodotto"></param>
        /// <returns></returns>
        public Edit Modifica(Prodotto Prodotto)
        {
            string sql = @"
                UPDATE Prodotti SET 
                    Codice=@Codice,BarCode=@BarCode,Descrizione=@Descrizione,IdAliquota=@IdAliquota,Prezzo=@Prezzo,IdTaglia=@IdTaglia,IdColore=@IdColore,IdParametro=@IdParametro,MinimoMagazzino=@MinimoMagazzino,IdFornitore=@IdFornitore 
                WHERE Id=@Id
            ";
            SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@Codice", Prodotto.Codice);
            cmd.Parameters.AddWithValue("@BarCode", Prodotto.BarCode);
            cmd.Parameters.AddWithValue("@Descrizione", Prodotto.Descrizione);
            cmd.Parameters.AddWithValue("@IdAliquota", (Guid)Prodotto.Aliquota.Id);
            cmd.Parameters.AddWithValue("@Prezzo", (double)Prodotto.Prezzo);
            cmd.Parameters.AddWithValue("@Id", (Guid)Prodotto.Id);

            SqlCeParameter idtaglia = new SqlCeParameter();
            idtaglia.DbType = DbType.Guid;
            idtaglia.ParameterName = "@IdTaglia";
            if (Prodotto.Taglia != null)
                idtaglia.Value = (Guid)Prodotto.Taglia.Id;
            else
                idtaglia.Value = DBNull.Value;
            cmd.Parameters.Add(idtaglia);

            SqlCeParameter idcolore = new SqlCeParameter();
            idcolore.DbType = DbType.Guid;
            idcolore.ParameterName = "@IdColore";
            if (Prodotto.Colore != null)
                idcolore.Value = (Guid)Prodotto.Colore.Id;
            else
                idcolore.Value = DBNull.Value;
            cmd.Parameters.Add(idcolore);

            SqlCeParameter idparametro = new SqlCeParameter();
            idparametro.DbType = DbType.Guid;
            idparametro.ParameterName = "@IdParametro";
            if (Prodotto.Parametro != null)
                idparametro.Value = (Guid)Prodotto.Parametro.Id;
            else
                idparametro.Value = DBNull.Value;
            cmd.Parameters.Add(idparametro);

            cmd.Parameters.AddWithValue("@MinimoMagazzino", (int)Prodotto.MinimoMagazzino);

            SqlCeParameter idfornitore = new SqlCeParameter();
            idfornitore.DbType = DbType.Guid;
            idfornitore.ParameterName = "@IdFornitore";
            if (Prodotto.Fornitore != null)
                idfornitore.Value = (Guid)Prodotto.Fornitore.Id;
            else
                idfornitore.Value = DBNull.Value;
            cmd.Parameters.Add(idfornitore);

            try
            {
                cmd.ExecuteNonQuery();
                return Edit.Successo;
            }
            catch
            {
                throw new ExceptionErroreModifica();
            }
        }
        /// <summary>
        /// Cancella un prodotto esistente tramite Id
        /// </summary>
        /// <param name="Prodotto"></param>
        /// <returns></returns>
        public Delete Cancella(Prodotto Prodotto)
        {
            string sql = @"
                DELETE FROM Prodotti 
                    WHERE Id=@Id
            ";
            SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@Id", (Guid)Prodotto.Id);
            try
            {
                cmd.ExecuteNonQuery();
                return Delete.Successo;
            }
            catch
            {
                throw new ExceptionErroreCancellazione();
            }
        }
        /// <summary>
        /// Seleziona il prodotto cercando per codice e descrizione
        /// </summary>
        /// <returns></returns>
        public List<Prodotto> Seleziona(string Valore)
        {
            string sql = @"
                SELECT * FROM Prodotti 
                    WHERE Codice LIKE '%" + Valore + "%' OR Descrizione LIKE '%" + Valore + "%' OR BarCode ='" + Valore + "'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Prodotto> ListaRitorno = new List<Prodotto>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Prodotto ProdottoRitorno = new Prodotto();
                    ProdottoRitorno.Id = (Guid)item["Id"];
                    ProdottoRitorno.Codice = item["Codice"].ToString();
                    ProdottoRitorno.BarCode = item["BarCode"].ToString();
                    ProdottoRitorno.Descrizione = item["Descrizione"].ToString();
                    ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)item["IdAliquota"]);
                    ProdottoRitorno.Prezzo = (double)item["Prezzo"];
                    if(item["IdTaglia"].ToString()!="")
                        ProdottoRitorno.Taglia = new ctrlTaglie().Seleziona((Guid)item["IdTaglia"]);
                    if(item["IdColore"].ToString()!="")
                        ProdottoRitorno.Colore = new ctrlColori().Seleziona((Guid)item["IdColore"]);
                    if(item["IdParametro"].ToString()!="")
                        ProdottoRitorno.Parametro = new ctrlParametri().Seleziona((Guid)item["IdParametro"]);
                    ProdottoRitorno.MinimoMagazzino = (int)item["MinimoMagazzino"];

                    ProdottoRitorno.Dettagli = new ctrlProdottiDettagli(ProdottoRitorno).Seleziona();
                    ListaRitorno.Add(ProdottoRitorno);
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona tutto da prodotti
        /// </summary>
        /// <returns></returns>
        public List<Prodotto> Seleziona()
        {
            string sql = @"
                SELECT * FROM Prodotti ORDER BY Codice ASC
            ";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Prodotto> ListaRitorno = new List<Prodotto>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Prodotto ProdottoRitorno = new Prodotto();
                    ProdottoRitorno.Id = (Guid)item["Id"];
                    ProdottoRitorno.Codice = item["Codice"].ToString();
                    ProdottoRitorno.BarCode = item["BarCode"].ToString();
                    ProdottoRitorno.Descrizione = item["Descrizione"].ToString();
                    ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)item["IdAliquota"]);
                    ProdottoRitorno.Prezzo = (double)item["Prezzo"];
                    if (item["IdTaglia"].ToString() != "")
                        ProdottoRitorno.Taglia = new ctrlTaglie().Seleziona((Guid)item["IdTaglia"]);
                    if (item["IdColore"].ToString() != "")
                        ProdottoRitorno.Colore = new ctrlColori().Seleziona((Guid)item["IdColore"]);
                    if (item["IdParametro"].ToString() != "")
                        ProdottoRitorno.Parametro = new ctrlParametri().Seleziona((Guid)item["IdParametro"]);
                    ProdottoRitorno.MinimoMagazzino = (int)item["MinimoMagazzino"];
                    if(item["IdFornitore"].ToString()!="")
                        ProdottoRitorno.Fornitore = new ctrlFornitori().Seleziona((Guid)item["IdFornitore"]);
                    ProdottoRitorno.Dettagli = new ctrlProdottiDettagli(ProdottoRitorno).Seleziona();
                    ListaRitorno.Add(ProdottoRitorno);
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Restituisce un valore boolean true se ci sono prodotti in sotto scorta nel magazzino
        /// </summary>
        /// <returns></returns>
        public bool ProdottiInSottoScorta()
        {
            List<Prodotto> ListaProdotti = SelezionaProdottiSottoScorta();
            if(ListaProdotti!=null && ListaProdotti.Count>0)
                return true;

            return false;
        }
        /// <summary>
        /// Seleziona tutto da prodotti in sotto scorta
        /// </summary>
        /// <returns></returns>
        public List<Prodotto> SelezionaProdottiSottoScorta()
        {
            string sql = @"
                SELECT DISTINCT(Prodotti.Id),Prodotti.* FROM Prodotti INNER JOIN 
                    Magazzino ON Prodotti.Id = Magazzino.IdProdotto
            ";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Prodotto> ListaRitorno = new List<Prodotto>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Prodotto Prod = new Prodotto();
                    Prod.Id=(Guid)item["Id"];
                    Prod.Codice=item["Codice"].ToString();

                    int Giacenza = new ctrlMagazzino().Disponibilita(Prod);
                    if (Giacenza <= new ctrlMagazzino().GetMinimoGiacenzaProdotto(Prod))
                    {
                        Prodotto ProdottoRitorno = new Prodotto();
                        ProdottoRitorno.Id = (Guid)item["Id"];
                        ProdottoRitorno.Codice = item["Codice"].ToString();
                        ProdottoRitorno.BarCode = item["BarCode"].ToString();
                        ProdottoRitorno.Descrizione = item["Descrizione"].ToString();
                        ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)item["IdAliquota"]);
                        ProdottoRitorno.Prezzo = (double)item["Prezzo"];
                        if (item["IdTaglia"].ToString() != "")
                            ProdottoRitorno.Taglia = new ctrlTaglie().Seleziona((Guid)item["IdTaglia"]);
                        if (item["IdColore"].ToString() != "")
                            ProdottoRitorno.Colore = new ctrlColori().Seleziona((Guid)item["IdColore"]);
                        if (item["IdParametro"].ToString() != "")
                            ProdottoRitorno.Parametro = new ctrlParametri().Seleziona((Guid)item["IdParametro"]);
                        ProdottoRitorno.MinimoMagazzino = (int)item["MinimoMagazzino"];
                        ProdottoRitorno.Dettagli = new ctrlProdottiDettagli(ProdottoRitorno).Seleziona();
                        ListaRitorno.Add(ProdottoRitorno);
                    }
                }
                return ListaRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona un oggetto prodotto da prodotti
        /// </summary>
        /// <param name="IdProdotto"></param>
        /// <returns></returns>
        public Prodotto Seleziona(Guid IdProdotto)
        {
            string sql = @"
                SELECT * FROM Prodotti
                    WHERE Id='"+IdProdotto+"'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                Prodotto ProdottoRitorno = new Prodotto();
                ProdottoRitorno.Id = (Guid)dt.Rows[0]["Id"];
                ProdottoRitorno.Codice = dt.Rows[0]["Codice"].ToString();
                ProdottoRitorno.BarCode = dt.Rows[0]["BarCode"].ToString();
                ProdottoRitorno.Descrizione = dt.Rows[0]["Descrizione"].ToString();
                ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)dt.Rows[0]["IdAliquota"]);
                ProdottoRitorno.Prezzo = (double)dt.Rows[0]["Prezzo"];
                if (dt.Rows[0]["IdTaglia"] != null)
                    ProdottoRitorno.Taglia = new ctrlTaglie().Seleziona((Guid)dt.Rows[0]["IdTaglia"]);
                if (dt.Rows[0]["IdColore"] != null)
                    ProdottoRitorno.Colore = new ctrlColori().Seleziona((Guid)dt.Rows[0]["IdColore"]);
                if (dt.Rows[0]["IdParametro"] != null)
                    ProdottoRitorno.Parametro = new ctrlParametri().Seleziona((Guid)dt.Rows[0]["IdParametro"]);
                ProdottoRitorno.MinimoMagazzino = (int)dt.Rows[0]["MinimoMagazzino"];
                ProdottoRitorno.Dettagli = new ctrlProdottiDettagli(ProdottoRitorno).Seleziona();
                return ProdottoRitorno;
            }
            return null;
        }
        /// <summary>
        /// Seleziona un oggetto prodotto da prodotti dove il codice = codice
        /// </summary>
        /// <param name="IdProdotto"></param>
        /// <returns></returns>
        public Prodotto ProdottoEsistente(string Codice)
        {
            string sql = @"
                SELECT * FROM Prodotti
                    WHERE Codice='" + Codice + "'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                Prodotto ProdottoRitorno = new Prodotto();
                ProdottoRitorno.Id = (Guid)dt.Rows[0]["Id"];
                ProdottoRitorno.Codice = dt.Rows[0]["Codice"].ToString();
                ProdottoRitorno.BarCode = dt.Rows[0]["BarCode"].ToString();
                ProdottoRitorno.Descrizione = dt.Rows[0]["Descrizione"].ToString();
                ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)dt.Rows[0]["IdAliquota"]);
                ProdottoRitorno.Prezzo = (double)dt.Rows[0]["Prezzo"];
                if (dt.Rows[0]["IdTaglia"].ToString() != "")
                    ProdottoRitorno.Taglia = new ctrlTaglie().Seleziona((Guid)dt.Rows[0]["IdTaglia"]);
                if (dt.Rows[0]["IdColore"].ToString() != "")
                    ProdottoRitorno.Colore = new ctrlColori().Seleziona((Guid)dt.Rows[0]["IdColore"]);
                if (dt.Rows[0]["IdParametro"].ToString() != "")
                    ProdottoRitorno.Parametro = new ctrlParametri().Seleziona((Guid)dt.Rows[0]["IdParametro"]);
                ProdottoRitorno.MinimoMagazzino = (int)dt.Rows[0]["MinimoMagazzino"];
                ProdottoRitorno.Dettagli = new ctrlProdottiDettagli(ProdottoRitorno).Seleziona();
                return ProdottoRitorno;
            }
            return null;
        }

        //Seleziona un prodotto per la vendita
        public Prodotto SelezionaProdottiVendita(string Codice)
        {
            string sql = @"
                SELECT * FROM Prodotti 
                    WHERE Codice='" + Codice + "' OR Barcode='" + Codice + "'";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Prodotto> ListaRitorno = new List<Prodotto>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Prodotto Prod = new Prodotto();
                    Prod.Id = (Guid)item["Id"];
                    Prod.Codice = item["Codice"].ToString();

                    int Giacenza = new ctrlMagazzino().Disponibilita(Prod);
                    int MinimoGiacenza = new ctrlMagazzino().GetMinimoGiacenzaProdotto(Prod);
                    if (MinimoGiacenza <= Giacenza)
                    {
                        Prodotto ProdottoRitorno = new Prodotto();
                        ProdottoRitorno.Id = Prod.Id;
                        ProdottoRitorno.Codice = item["Codice"].ToString();
                        ProdottoRitorno.Aliquota = new ctrlAliquote().Seleziona((Guid)item["IdAliquota"]);
                        ProdottoRitorno.Prezzo = (double)item["Prezzo"];
                        ProdottoRitorno.Descrizione = item["Descrizione"].ToString();
                        return ProdottoRitorno;
                    }
                }
            }
            return null;
        }
    }
}
